package com.zp.self.module.level_4_算法练习.算法.双指针.左右指针;
import org.junit.Test;

import java.util.Arrays;

/**
 * @author By ZengPeng
 */
public class 力扣_1089_复写零 {
    @Test
    public void main() {
        
        Solution solution = new 力扣_1089_复写零().new Solution();
//        int[] ints = {1,0,2,3,0,4,5,0};
        int[] ints = {1, 0, 2,  0, 4};
        solution.duplicateZeros(ints);
        System.out.println(Arrays.toString(ints));
    }

    /**
     题目：给你一个长度固定的整数数组 arr ，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。
         注意：请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。

         示例 1：
         输入：arr = [1,0,2,3,0,4,5,0]
         输出：[1,0,0,2,3,0,0,4]
         解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]

         示例 2：
         输入：arr = [1,2,3]
         输出：[1,2,3]
         解释：调用函数后，输入的数组将被修改为：[1,2,3]

     分析：【P 💖】
        1.新数组记录：然后重新替换原数组
                --执行耗时:0 ms,击败了100.00% 的Java用户
                --编码耗时:[7:18]
        2.双指针：第一次遍历，找到最后有效数据位
                 然后从后向前遍历，将元素替换

     边界值 & 注意点：
        1.
     **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public void duplicateZeros(int[] arr) {
        int i=0,index=0,len = arr.length;
        while (i < len && index<len) {
            ++index;
            if(arr[i++]==0)
                ++index;
        }
        i--;index--;
        //最后一个可能超出了，只补了一个零的情况
        if(index==len){
            arr[--index] = arr[i--];
            index--;
        }
        while (index >0) {
            if(arr[i]==0)
                arr[index--] = arr[i];
            arr[index--] = arr[i--];
        }
    }
    public void duplicateZeros_1(int[] arr) {
        int[] newArr = new int[arr.length+1];
        int index=0,len = arr.length;
        for (int i = 0; i < len && index < len; i++) {
            newArr[index] = arr[i];
           if(arr[i]==0)
               newArr[++index] = 0;
           index++;
        }
        System.arraycopy(newArr,0,arr,0,len);
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}